﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace WebHelper
{
    public abstract class AbstractNodo
    {
        private string nombre;
        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        private List<AbstractNodo> hijos;
        public List<AbstractNodo> Hijos
        {
            get { return hijos; }
            set { hijos = value; }
        }

        private string atributoId;
        /// <summary>
        /// Atributo del "Tipo" que es identificador.
        /// </summary>
        public string AtributoId
        {
            get { return atributoId; }
            set { atributoId = value; }
        }

        private string lineaDisplay;
        /// <summary>
        /// Línea de display. 
        /// <example>
        /// <code>
        /// class A
        /// {
        ///     public string Nombre { ... }
        ///     public int Numero { ... }
        /// }
        /// LineaDisplay = "{$Numero}. {$Nombre}"
        /// </code>
        /// 
        /// 
        /// Mostrará, por ejemplo:
        ///  | 1. Pedro
        ///  | 2. Román
        ///  | 3. Ailén
        ///  
        /// Otro uso puede ser:
        /// LineaDisplay = "Nombre"
        /// </example>
        /// </summary>
        public string LineaDisplay
        {
            get { return lineaDisplay; }
            set { lineaDisplay = value; }
        }

        public abstract IList ObtenerEntidades();

        public void AgregarHijo(AbstractNodo hijo)
        {
            Hijos.Add(hijo);
        }

        /// <summary>
        /// Genera el título del elemento del árbol.
        /// </summary>
        /// <param name="st"></param>
        /// <returns></returns>
        public string GetTitulo(Storer st)
        {
            if (!LineaDisplay.Contains("{$"))
            {
                return st.GetValue(LineaDisplay).ToString();
            }
            else
            {
                string p = LineaDisplay;

                while (p.Contains("{$"))
                {
                    string cut = p.Substring(p.IndexOf("{$"));
                    cut = cut.Substring(0, cut.IndexOf("}") + 1);
                    string atrib = cut.Substring(2, cut.Length - 3);
                    p = p.Replace(cut, st.GetValue(atrib).ToString());
                }

                return p;
            }
        }

        public AbstractNodo(string nombre, string atributoId, string display)
        {
            Nombre = nombre;
            LineaDisplay = display;
            AtributoId = atributoId;
            Hijos = new List<AbstractNodo>();
        }
    }
}
